#-
# ==========================================================================
# Copyright (C) 2008 Autodesk, Inc. and/or its licensors.  All 
# rights reserved.
#
# The coded instructions, statements, computer programs, and/or related 
# material (collectively the "Data") in these files contain unpublished 
# information proprietary to Autodesk, Inc. ("Autodesk") and/or its 
# licensors, which is protected by U.S. and Canadian federal copyright 
# law and by international treaties.
#
# The Data is provided for use exclusively by You. You have the right 
# to use, modify, and incorporate this Data into other products for 
# purposes authorized by the Autodesk software license agreement, 
# without fee.
#
# The copyright notices in the Software and this entire statement, 
# including the above license grant, this restriction and the 
# following disclaimer, must be included in all copies of the 
# Software, in whole or in part, and all derivative works of 
# the Software, unless such copies or derivative works are solely 
# in the form of machine-executable object code generated by a 
# source language processor.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. 
# AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED 
# WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF 
# NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 
# PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE, OR 
# TRADE PRACTICE. IN NO EVENT WILL AUTODESK AND/OR ITS LICENSORS 
# BE LIABLE FOR ANY LOST REVENUES, DATA, OR PROFITS, OR SPECIAL, 
# DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK 
# AND/OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY 
# OR PROBABILITY OF SUCH DAMAGES.
#
# ==========================================================================
#+

# This example demonstrates how to provide Python's pdb debugger with
# a basic graphical interface when run within Maya.
#
# To use it, execute the 'run' with an argument consisting of the
# function call to be debugged, as a string. E.g:
#
#	guipdb.run('myFunc(12, "hello")')

import pdb
import sys
import os
import maya.cmds as cmds


# All that pdb requires of its input object are 'read' and 'readline'
# methods.
#
# This class is a drop-in replacement for Maya's sys.stdin which will
# bring up a GUI customized for use with pdb.
class DebuggerStandardInput:
	def readline( self ):
		if 'MAYA_IGNORE_DIALOGS' in os.environ:
			return '\n'
		else:
			return self._getUserDebugResponse()
		
	def read( self ):
		return self._getUserDebugResponse()
	
	def _getUserDebugResponse(self):
		result = cmds.promptDialog(
			title='Simple Debugger',
			message='Debugger command:',
			button=['Step Into', 'Step Over','Command'],
			defaultButton='Command')

		if result == 'Command':
			result = cmds.promptDialog(query=True, text=True)
		elif result == 'Step Over':
			result = 'n'
		elif result == 'Step Into':
			result = 's'
		return result


# All that pdb requires of its output object are 'write', 'writeline'
# and 'flush' methods.
#
# This class is a drop-in replacement for Maya's sys.stdout which will
# filter out unwanted prompts from pdb.
class DebuggerStandardOutput:
	def __init__(self, orig_stdout):
		self.orig_stdout = orig_stdout

	def write(self, msgoutput):
		line = msgoutput.strip()
		# If this is a pdb prompt, toss it away.
		if line[:5] == "(Pdb)":
			line = "\n"
		self.orig_stdout.write(line)

	def writelines(self, msgSeq):
		for l in msgSeq:
			self.write(l)

	def flush(self):
		return None


# Run our GUI version of pdb on a command string.
def run(command):
	# Save Maya's current stdin and stdout.
	orig_stdin = sys.stdin
	orig_stdout = sys.stdout

	# Replace stdin and stdout with instances of our own classes.
	sys.stdin = DebuggerStandardInput()

	# Run pdb.
	pdb.run(command)

	# Restore Maya's original stdin and stdout.
	sys.stdin = orig_stdin
	sys.stdout = orig_stdout
